package com.gagakuai.concurrent.locks;

import java.util.Date;
import java.util.concurrent.TimeUnit;

/*
 * 条件队列
 */
public interface Condition {

    /*
     * 使当前线程暂时陷入阻塞，允许带有中断标记
     */
    void awaitUninterruptibly();

    /*
     * 使当前的活跃线程陷入阻塞，禁止阻塞带有中断标记的线程
     */
    void await() throws InterruptedException;

    /*
     * 使当前活跃的线程暂时陷入阻塞，禁止阻塞带有中断标记的线程，nanosTimeout为相对时间，用于设置超时
     */
    long awaitNaos(long nanosTimeout) throws InterruptedException;

    /*
     * 使当前活跃的线程暂时陷入阻塞，禁止阻塞带有中断标记的线程，time为相对时间，需经过unit处理，用于设置超时
     */
    void awaitNanos(long nanosTimeout, TimeUnit unit) throws InterruptedException;

    /*
     * 使当前活跃的线程暂时陷入阻塞，禁止阻塞带有中断标记的线程，deadline为绝对时间，用于设置超时
     */
    boolean awaitUntil(Date deadline) throws InterruptedException;


    /*
     * 使一个被await()阻塞的线程重新投入运行
     */
    void signal();

    /*
     * 使当前所有被await()阻塞的线程重新投入运行
     */
    void signalAll();
}
